<?php
use \Firebase\JWT\JWT;
use Firebase\JWT\Key;
// 应用公共文件
// 生成 JWT
function signToken($uid)
{
    $key = '!@#$%*&'; // 密钥，确保生成和验证时使用相同的密钥
    echo "Generating JWT with key: " . $key . "\n"; // 打印密钥
    $payload = [
        'iss' => 'abcdefg', // 签发者
        'aud' => '', // 面向的用户
        'iat' => time(), // 签发时间
        'nbf' => time() + 3, // 在什么时候 JWT 开始生效
        'exp' => time() + 3600, // 过期时间
        'data' => [
            'uid' => $uid, // 用户 ID
        ]
    ];

    $jwt = JWT::encode($payload, $key, 'HS256'); // 使用 HS256 算法生成 JWT
    echo "Generated JWT: " . $jwt . "\n"; // 打印生成的 JWT

    return $jwt;
}

// 验证 JWT
function checkToken($token)
{
    $key = '!@#$%*&'; // 密钥，确保生成和验证时使用相同的密钥
    echo "Validating JWT with key: " . $key . "\n"; // 打印密钥
    $status = ['status' => 200];

    try {
        JWT::$leeway = 60; // 当前时间减去60，把时间留点余地
        $decoded = JWT::decode($token, new Key($key, 'HS256')); // 使用 HS256 算法验证 JWT
        $arr = (array)$decoded;
        print_r($arr);
        return [
            'status' => 200,
            'data' => $arr['data']
        ];
    } catch (\Firebase\JWT\SignatureInvalidException $e) { // 签名不正确

        return [
            'status' => 401,
            'msg' => "签名不正确"
        ];
    } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
        return [
            'status' => 401,
            'msg' => "token 尚未生效"
        ];
    } catch (\Firebase\JWT\ExpiredException $e) { // token 过期
        return [
            'status' => 401,
            'msg' => "token 已过期"
        ];
    } catch (\UnexpectedValueException $e) { // 其他错误
        return [
            'status' => 401,
            'msg' => "无效的 token"
        ];
    } catch (Exception $e) { // 其他错误
        return [
            'status' => 401,
            'msg' => "未知错误: " . $e->getMessage()
        ];
    }
}
